
import threading 
from Signals.Exit import Exit
from Signals.FinPrograma import FinPrograma
import time
from Memory.ContinuosAsignment.MMU import MMU

class Cpu(threading.Thread):
    
    #Se inicia CPU con una memoria(asignacion continua) y un kernel
    def __init__(self, memory, kernel):
        threading.Thread.__init__(self)
        self.pc = None
        self.memory = memory
        self.kernel = kernel
        self.mmu = MMU(self.memory, self)
    
    def setPc(self, unPcb):
        print("-- actualizo el pc -- ")
        self.pc = unPcb
    
    def stop(self):
        self._stop()
        
    #Arranca a correr el CPU
    def run(self):
        print("Se inicio el CPU")
        time.sleep(1)
        #Cuando arranca el kernel setea getCorriendo() en true, de esta manera arranca
        #a ejecutarse CPU
        while self.kernel.getCorriendo():
            if(self.kernel.IsUserMode()):
                ######################################
                #Si tiene cargado un pc, lo va a buscar a memoria
                if self.pc is not None:
                    instr = self.mmu.readMemory(self.pc)
                    #Si la instruccion es de CPU y no esta vacia la ejecuta
                    if instr is not None:
                        if (instr.cpu == 1):
                            self.ejecutar(instr)
                        #Si la instruccion es de IO la guarda en la cola de IO
                        else:
                            self.kernel.ioReady.append(instr)
                    #Si la instruccion esta vacia se lanza una senial "EXIT" y "FINPROGRAMA"
                    else:
                        self.kernel.interrupt(Exit())
                        self.kernel.interrupt(FinPrograma())
                #########################################
                else:
                    time.sleep(0.5)

    #Ejecuta la instruccion          
    def ejecutar(self, instr):
        instr.execute(self.pc)
        time.sleep(0.5)
            
                        